package other.one;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 房间服务，这个房间服务主要功能为管理房间以及房间内的成员（String 类型）。
 * 如果房间不存在则创建这个房间
 * <p>
 * 保证并发情况下的房间用户数据一致性
 */
public class RoomServiceImpl implements RoomService {


    // 定义一个缓存容器，用于记录每个房间的人员信息  key->roomId , value -> 人员ID列表
    private final ConcurrentHashMap<String, Set<String>> roomCache = new ConcurrentHashMap<>();

    @Override
    public void joinRoom(String userId, String roomId) throws RuntimeException {
        // 特殊情况判断
        if (roomId == null | userId == null) {
            return;
        }
        // 使用hashSet避免单个用户重复加入房间
        roomCache.putIfAbsent(roomId, new HashSet<>());
        synchronized (RoomServiceImpl.class) {
            roomCache.get(roomId).add(userId);
        }
    }

    @Override
    public void leaveRoom(String userId, String roomId) throws RuntimeException {
        // 特殊情况判断
        if (roomId == null | userId == null) {
            return;
        }
        synchronized (RoomServiceImpl.class) {
            Set<String> userSet = roomCache.get(roomId);
            if (userSet == null) {
                return;
            }
            userSet.remove(userId);
        }
    }

    @Override
    public Collection<String> queryUser(String roomId) throws RuntimeException {
        Set<String> userId = roomCache.get(roomId);
        return null == userId ? new HashSet<>() : userId;
    }
}